package com.yangcangclub.merchandise.domain;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.yangcangclub.commons.exception.ApolloException;
import com.yangcangclub.commons.result.MessageEnum;
import com.yangcangclub.commons.utils.DateUtil;
import com.yangcangclub.commons.utils.StringUtil;
import com.yangcangclub.merchandise.base.MerchandiseBaseDomain;
import com.yangcangclub.merchandise.bean.Product;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 商品模块基础domain
 * Created by 肖明明 on 2017/2/20.
 */
@Component
public class ProductBaseDomain extends MerchandiseBaseDomain {

    /** 添加商品 */
    public int addProduct(Product pd){
        super.getMasterJdbc().insert("merchandise.ProductMapper.insertProduct",pd);
        return pd.getId();
    }
    /**修改商品orderSort*/
    public int updateOrderSort(int id,int orderSort){
        Map m=Maps.newHashMap();
        m.put("id",id);
        m.put("orderSort",orderSort);
        return super.getMasterJdbc().update("merchandise.ProductMapper.updateProductOrderSort",m);
    }

    /** 修改商品信息*/
    public int updateProductInfo(Product pd){
        return super.getMasterJdbc().update("merchandise.ProductMapper.updateProductInfo",pd);
    }

     /** 获取商城商品列表，有排序*/
     public List<Product> getShowProductList(String category,int isLimit,int orderSort,int pageSize) {
         if(isLimit == 2){//限购
             //获取一条正在进行（在开始时间和结束时间之间）的限时购商品、
             // 不存在则获取距离开始时间两个小时内的限时购商品、
             // 不存在则获取距离结束时间最近的一个限时购商品（即上一个活动结束的限时购商品）
             Map m = Maps.newHashMap();
             //查询正在进行的限时购活动
             m.put("startTimeEnd", DateUtil.getNowDate());
             m.put("endTimeBegin", DateUtil.getNowDate());
             m.put("isLimit", isLimit);
             m.put("status", 1);
             m.put("sortColumns","start_time asc");
             List<Product> productList = super.getMasterJdbc().selectList("merchandise.ProductMapper.getShowLimitProduct", m);
             if (productList.size() > 0) {
                 return productList;
             }
             //查询距离开始时间两个小时内的
             m.clear();
             m.put("startTimeBegin", DateUtil.getNowDate());
             m.put("startTimeEnd", org.apache.commons.lang.time.DateUtils.addHours(new Date(), 2));
             m.put("isLimit", isLimit);
             m.put("status", 1);
             m.put("sortColumns","start_time asc");
             productList = super.getMasterJdbc().selectList("merchandise.ProductMapper.getShowLimitProduct", m);
             if (productList.size() > 0) {
                 return productList;
             }
             //查询距离结束时间最近的一个限时购商品
             m.clear();
             m.put("endTimeEnd", DateUtil.getNowDate());
             m.put("isLimit", isLimit);
             m.put("status", 1);
             m.put("sortColumns","end_time desc");
             productList = super.getMasterJdbc().selectList("merchandise.ProductMapper.getShowLimitProduct", m);
             if (productList.size() > 0) {
                 return productList;
             }
             return productList;
         }else{
             Map m = Maps.newHashMap();
             m.put("isLimit", isLimit);
             m.put("orderSort", orderSort);
             m.put("pageSize", pageSize);
             if(StringUtil.isNotEmpty(category)){
                 m.put("category", category);
             }
             return super.getMasterJdbc().selectList("merchandise.ProductMapper.selectShowProductList", m);
         }
     }
     /** 根据ID列表获取商品概要信息列表*/
    public List<Product> getProductListByIds(List<Integer> ids){
        return super.getMasterJdbc().selectList("merchandise.ProductMapper.selectProductionInfoListByIds",ids);
    }

     /** 根据ID获取商品详情*/
    public Product getProductById(int id){
        return super.getMasterJdbc().selectOne("merchandise.ProductMapper.selectProductionInfoById",id);
    }

     /** 购买减库存*/
    public boolean sellReduceInventoriesById(int pid,int num){
        Map map= Maps.newHashMap();
        map.put("pid",pid);
        map.put("num",num);
        return super.getMasterJdbc().update("merchandise.ProductMapper.updateProductInventoriesBySell",map)==1;
    }

    /** 后台获取商品信息分页列表*/
    public Map getPagenationProductList(int start,int pageSize,Map map){
        map.put("start",start);
        map.put("pageSize",pageSize);
        List productList=super.getMasterJdbc().selectList("merchandise.ProductMapper.selectProductListByPage",map);
        Long num=super.getMasterJdbc().selectOne("merchandise.ProductMapper.selectProductListByPageNum",map);
        num=num==null?0:num;
        map.clear();
        map.put("total",num);
        map.put("list",productList);
        return map;
    }

    /**
     * 单纯修改库存，做更新不是加减。需要核对历史版本
     * @param pid
     * @param num  新库存
     * @return
     */
    public boolean updateInventoriesById(int pid,int oldNum,int num){
        Map map= Maps.newHashMap();
        map.put("pid",pid);
        map.put("new",num);
        map.put("old",oldNum);
        return super.getMasterJdbc().update("merchandise.ProductMapper.updateProductInventoriesByIdAndVersion",map)==1;
    }

    /** 
     * 单纯修改库存，加减。不需要核对历史版本
     * 暂时是活动模块操作商品库存时使用：添加活动减商品库存；活动结束后将占用的商品库存释放
     * @param pid
     * @param num  正加负减
     * @return
     */
    public boolean reduceInventoriesById(int pid,int num){
        Map map= Maps.newHashMap();
        map.put("pid",pid);
        map.put("num",num);
        return super.getMasterJdbc().update("merchandise.ProductMapper.plusOrMinusInventoriesById",map)==1;
    }

    /**
     * 订单超时或取消订单恢复库存
     * @param pid 商品ID
     * @param num 恢复库存数量
     * @return
     */
    public boolean recoverInventoriesById(int pid,int num){
        Map map= Maps.newHashMap();
        map.put("pid",pid);
        map.put("num",num);
        return super.getMasterJdbc().update("merchandise.ProductMapper.recoverInventoriesById",map)==1;
    }
    
    
    /**修改商品状态*/
    public boolean updateProductionStatusById(int pid,int status){
        Map map= Maps.newHashMap();
        map.put("pid",pid);
        map.put("status",status);
        return super.getMasterJdbc().update("merchandise.ProductMapper.updateProductStatus",map)==1;
    }

    //------------------------
    /**添加商品附带信息*/
    public int updateProductExtInfo(int pid,int isFuxi,int isEveryday,int isConcentrate,int isLimit,
                                 String startTime,String endTime,int showInventory,int warehouseType,int isShowModule){
        Map m=Maps.newHashMap();
        m.put("pid",pid);
        m.put("isFuxi",isFuxi);
        m.put("isEveryday",isEveryday);
        m.put("isConcentrate",isConcentrate);
        m.put("isLimit",isLimit);
        m.put("startTime",isLimit==2?startTime:null);
        m.put("endTime",isLimit==2?endTime:null);
        m.put("showInventory",showInventory);
        m.put("warehouseType",warehouseType);
        m.put("isShowModule",isShowModule);
        return super.getMasterJdbc().update("merchandise.ProductMapper.updateProductExtInfo",m);
    }

    /**
     * 获取上下一条产品orderSort记录
     * @param orderSort
     * @param type 1上一条，2下一条
     * @return
     */
    public Map<String,Object> getTargetChangeOrderSortProduct(int id,int orderSort,int type){
        Map m=null;
        if(type==1){//1上一条
            m=super.getMasterJdbc().selectOne("merchandise.ProductMapper.getUpperProductionOrderSort",orderSort);
        }else //2下一条
            m=super.getMasterJdbc().selectOne("merchandise.ProductMapper.getDownerProductionOrderSort",orderSort);
        return m;
    }

    /**
     * 修改限购商品限购时间
     * @param pid
     * @return
     */
    public boolean changeLimitProductTime(int pid, String startData, String endDate){
        Map m=Maps.newHashMap();
        m.put("pid",pid);
        m.put("startTime",startData);
        m.put("endTime",endDate);
        return super.getMasterJdbc().update("merchandise.ProductMapper.changeLimitProductTime",m)==1;
    }

    /**根据条件统计数量
     * @param map
     * @return
     */
    public int selectCountByCondition(Map map){
        Long num = super.getSlaveJdbc().selectOne("merchandise.ProductMapper.selectProductListByPageNum",map);
        num=num==null?0:num;
        return num.intValue();
    }

    /**设置限时购模块是否显示
     * @param isShowModule
     * @return
     */
    public void updateProductIsShowModule(int isShowModule){
        Map map= Maps.newHashMap();
        map.put("isShowModule",isShowModule);
        super.getMasterJdbc().update("merchandise.ProductMapper.updateProductIsShowModule",map);
    }

}
